package neo.tetris.bean.model.battle;

import java.util.Timer;
import java.util.TimerTask;
import java.util.UUID;

import neo.tetris.bean.conf.BattleConf;
import neo.tetris.bean.conf.BattleConfPlayer;
import neo.tetris.rpc.message.MessageImpl;
import neo.tetris.rpc.session.SessionGroup;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 * 1）对战时，跟战棋类游戏一样，地图被划分成小格子！游戏采用了基本的三连作为攻击和防御手段，同颜色的同类兵种如果横排三连，可建立防御墙，起到抵御敌方攻击；
 * 如果同颜色同类兵种竖排三连，就会进入蓄力状态，蓄力结束后进行攻击（进入蓄力状态后，会显示4，3，2，1这四个数值，状态显示为1的竖排三连就会进入攻击）。
 * 横排可以同时形成4连和5连
 * ，不过并无特殊奖励。竖排只能三连。进入蓄力的单位，形成阵列，准备攻击，根据兵种不同需要等待一定回合后才会进行攻击。没进入蓄力的单位为散兵。 2）
 * 所有消失的单位（攻入敌阵、被敌人杀死）都会退回到等待区，按增兵键，可以将等待区所有单位放出，兵种随机胜利条件为战胜敌方英雄，己方英雄死亡则失败。 3）
 * 双方轮流行动，每回合有三次行动次数。首回合先动只有两次行动次数。 4） 英雄释放技能不减少行动次数。删兵和增兵同样减少行动数。 5）
 * 特殊连携可以增加行动数
 * ，删除散兵时造成三连，移动一次单位造成两次或者以上连携时，都会增加行动数。如果只移动一个单位就造成了4次连携（横竖都可），那么可以增加三次行动数。 6）
 * 核心兵种无数量限制
 * ，精英携带数量为10，冠军携带数量为3。精英和冠军在散兵和蓄力状态被杀死（包括己方主动消除），会扣减携带数量。当扣减后携带数量为0时，增兵时不会再出现
 * 。胜利后也不会获得经验。
 * 
 * @author feng.lee
 * @create on 2013-8-12
 */
public class Battle {
	static Logger logger = LoggerFactory.getLogger(Battle.class);

	static public final int INTERVAL = 30;

	static public final int STATE_PREPARING = 1;

	static public final int STATE_PLAYING = 2;

	public final SessionGroup observer;

	// 身份唯一ID
	public final String instanceUuid;

	// 名字
	public String name;

	public final BattlePlayer[] players;

	public final BattleConf conf;

	// 游戏开始GMT时间")
	public long startTime;

	public long tickedTime;

	public int state;
	
	final public Timer timer;

	public Battle(BattleConf conf) {
		super();

		this.instanceUuid = UUID.randomUUID().toString();
		this.name = "";
		this.conf = conf;
		this.state = STATE_PREPARING;
		this.players = new BattlePlayer[conf.players.length];
		for (int i = 0; i < conf.players.length; i++) {
			BattleConfPlayer confPlayer = conf.players[i];
			if (confPlayer.controller.equals(BattleConfPlayer.CONTROLLER_COMPUTER)) {
				this.players[i] = new BattlePlayerComputer(this, i, confPlayer);
			} else if (confPlayer.controller.equals(BattleConfPlayer.CONTROLLER_HUMAN)) {
				this.players[i] = new BattlePlayerHuman(this, i, confPlayer);
			}
		}
		this.observer = new SessionGroup();
		this.timer = new Timer();
	}
}
